package excel

import (
	"fmt"
	"github.com/xuri/excelize/v2"
)

// CreateXlsxTest 测试多个sheet
func CreateXlsxTest(fileName string) {
	//--创建
	//使用 NewFile 新建 Excel 工作薄，新创建的工作簿中会默认包含一个名为 Sheet1 的工作表
	f := excelize.NewFile()

	//--设置工作表名称
	//根据给定的新旧工作表名称（大小写敏感）重命名工作表。工作表名称最多允许使用 31 个字符，
	//此功能仅更改工作表的名称，而不会更新与单元格关联的公式或引用中的工作表名称。
	//因此使用此功能重命名工作表后可能导致公式错误或参考引用问题。
	sheetName := "学生成绩单"
	f.SetSheetName("Sheet1", sheetName) //设置工作表的名称

	grade := [][]interface{}{
		{"考试成绩统计表"},
		{"考试名称:期中考试", nil, nil, "文综", nil, nil, "理综"},
		{"序号", "学号", "姓名", "历史", "地理", "政治", "生物", "化学", "物理", "总分", "平均分"},
		{1, "1001", "青雉1", 11, 22, 33, 44, 55, 66, nil, nil},
		{2, "1002", "青雉2", 11, 22, 33, 44, 55, 66, nil, nil},
		{3, "1003", "青雉3", 11, 22, 33, 44, 55, 66, nil, nil},
		{4, "1004", "青雉4", 11, 22, 33, 44, 55, 66, nil, nil},
		{5, "1005", "青雉5", 11, 22, 33, 44, 55, 66, nil, nil},
		{6, "1006", "青雉6", 11, 22, 33, 44, 55, 66, nil, nil},
	}
	for i, obj := range grade {
		//--根据行和列拼接单元格名称
		name, err := excelize.JoinCellName("A", i+1)
		if err != nil {
			fmt.Println(fmt.Sprintf("拼接单元格名称失败,错误:%s", err))
			return
		}

		//--按行赋值
		//根据给定的工作表名称（大小写敏感）、起始坐标和 slice 类型引用按行赋值。
		//例如，在名为 Sheet1 的工作簿第 6 行上，以 B6 单元格作为起始坐标按行赋值：
		//err := f.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2})
		err = f.SetSheetRow(sheetName, name, &obj)
		if err != nil {
			fmt.Println(fmt.Sprintf("按行写入数据失败,错误:%s", err))
			return
		}
	}

	//第二页写入
	f.NewSheet("Sheet2")
	sheetName = "学生成绩单2"
	f.SetSheetName("Sheet2", sheetName) //设置工作表的名称
	for i, obj := range grade {
		//--根据行和列拼接单元格名称
		name, err := excelize.JoinCellName("A", i+1)
		if err != nil {
			fmt.Println(fmt.Sprintf("拼接单元格名称失败,错误:%s", err))
			return
		}

		//--按行赋值
		//根据给定的工作表名称（大小写敏感）、起始坐标和 slice 类型引用按行赋值。
		//例如，在名为 Sheet1 的工作簿第 6 行上，以 B6 单元格作为起始坐标按行赋值：
		//err := f.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2})
		err = f.SetSheetRow(sheetName, name, &obj)
		if err != nil {
			fmt.Println(fmt.Sprintf("按行写入数据失败,错误:%s", err))
			return
		}
	}

	/*buffer, err := f.WriteToBuffer()
	if err != nil {
		fmt.Println(fmt.Sprintf("WriteToBuffer,错误:%s", err))
		return
	}
	//文件字节数组形式
	buffer.Bytes()*/

	// 保存文件
	if err := f.SaveAs(fileName + ".xlsx"); err != nil {
		fmt.Println(err)
	}
}

// CreateMultipleXlsx data为要写入的数据(key-sheetName, val-工作表数据),fileName 文件名称
func CreateMultipleXlsx(dataMap map[string][][]interface{}, fileName string) {
	if dataMap == nil || len(dataMap) <= 0 {
		return
	}

	//使用 NewFile 新建 Excel 工作薄，新创建的工作簿中会默认包含一个名为 Sheet1 的工作表
	f := excelize.NewFile()

	sheetIdx := 1
	for sheetName, sheetData := range dataMap {
		//设置工作表的名称
		oldSheetName := fmt.Sprintf("%s%d", "Sheet", sheetIdx)
		f.NewSheet(oldSheetName)
		f.SetSheetName(oldSheetName, sheetName)
		sheetIdx++

		for i, obj := range sheetData {
			//--根据行和列拼接单元格名称
			name, err := excelize.JoinCellName("A", i+1)
			if err != nil {
				fmt.Println(fmt.Sprintf("拼接单元格名称失败,错误:%s", err))
				return
			}

			//--按行赋值
			//根据给定的工作表名称（大小写敏感）、起始坐标和 slice 类型引用按行赋值。
			//例如，在名为 Sheet1 的工作簿第 6 行上，以 B6 单元格作为起始坐标按行赋值：
			//err := f.SetSheetRow("Sheet1", "B6", &[]interface{}{"1", nil, 2})
			err = f.SetSheetRow(sheetName, name, &obj)
			if err != nil {
				fmt.Println(fmt.Sprintf("按行写入数据失败,错误:%s", err))
				return
			}
		}

	}

	// 保存文件
	if err := f.SaveAs(fileName + ".xlsx"); err != nil {
		fmt.Println(err)
	}
}
